package net.suncaper.mvc.service.impl;

import net.suncaper.mvc.exception.BusinessException;
import net.suncaper.mvc.mapper.MessageMapper;
import net.suncaper.mvc.mapper.impl.MessageMapperImpl;
import net.suncaper.mvc.model.domain.Message;
import net.suncaper.mvc.service.IMessageService;

import java.util.Date;
import java.util.List;

/**
 * 消息服务接口实现类
 */
public class MessageServiceImpl implements IMessageService {
    
    private final MessageMapper messageMapper = new MessageMapperImpl();
    
    /**
     * 添加消息
     * @param message 消息信息
     * @return 添加结果
     */
    @Override
    public boolean addMessage(Message message) {
        // 校验必填字段
        if (message.getUserId() == null || message.getTitle() == null || 
            message.getContent() == null || message.getType() == null) {
            throw new BusinessException("消息信息不完整，请补充必要信息");
        }
        
        // 设置默认值
        if (message.getIsRead() == null) {
            message.setIsRead(false); // 默认未读
        }
        
        if (message.getCreateTime() == null) {
            message.setCreateTime(new Date()); // 默认当前时间
        }
        
        return messageMapper.insertMessage(message);
    }
    
    /**
     * 根据消息ID获取消息
     * @param id 消息ID
     * @return 消息信息
     */
    @Override
    public Message getMessageById(Long id) {
        if (id == null) {
            throw new BusinessException("消息ID不能为空");
        }
        return messageMapper.selectMessageById(id);
    }
    
    /**
     * 根据用户ID获取消息列表
     * @param userId 用户ID
     * @return 消息列表
     */
    @Override
    public List<Message> getMessagesByUserId(String userId) {
        if (userId == null || userId.isEmpty()) {
            throw new BusinessException("用户ID不能为空");
        }
        return messageMapper.selectMessagesByUserId(userId);
    }
    
    /**
     * 根据用户ID和消息类型获取消息列表
     * @param userId 用户ID
     * @param type 消息类型
     * @return 消息列表
     */
    @Override
    public List<Message> getMessagesByUserIdAndType(String userId, String type) {
        if (userId == null || userId.isEmpty()) {
            throw new BusinessException("用户ID不能为空");
        }
        if (type == null || type.isEmpty()) {
            throw new BusinessException("消息类型不能为空");
        }
        return messageMapper.selectMessagesByUserIdAndType(userId, type);
    }
    
    /**
     * 根据用户ID获取未读消息列表
     * @param userId 用户ID
     * @return 未读消息列表
     */
    @Override
    public List<Message> getUnreadMessagesByUserId(String userId) {
        if (userId == null || userId.isEmpty()) {
            throw new BusinessException("用户ID不能为空");
        }
        return messageMapper.selectUnreadMessagesByUserId(userId);
    }
    
    /**
     * 获取用户未读消息数量
     * @param userId 用户ID
     * @return 未读消息数量
     */
    @Override
    public int getUnreadMessageCount(String userId) {
        if (userId == null || userId.isEmpty()) {
            throw new BusinessException("用户ID不能为空");
        }
        return messageMapper.countUnreadMessagesByUserId(userId);
    }
    
    /**
     * 标记消息为已读
     * @param id 消息ID
     * @return 更新结果
     */
    @Override
    public boolean markMessageAsRead(Long id) {
        if (id == null) {
            throw new BusinessException("消息ID不能为空");
        }
        return messageMapper.markMessageAsRead(id);
    }
    
    /**
     * 标记用户的所有消息为已读
     * @param userId 用户ID
     * @return 更新结果
     */
    @Override
    public boolean markAllMessagesAsRead(String userId) {
        if (userId == null || userId.isEmpty()) {
            throw new BusinessException("用户ID不能为空");
        }
        return messageMapper.markAllMessagesAsRead(userId);
    }
    
    /**
     * 删除消息
     * @param id 消息ID
     * @return 删除结果
     */
    @Override
    public boolean deleteMessageById(Long id) {
        if (id == null) {
            throw new BusinessException("消息ID不能为空");
        }
        return messageMapper.deleteMessageById(id);
    }
    
    /**
     * 删除用户的所有消息
     * @param userId 用户ID
     * @return 删除结果
     */
    @Override
    public boolean deleteMessagesByUserId(String userId) {
        if (userId == null || userId.isEmpty()) {
            throw new BusinessException("用户ID不能为空");
        }
        return messageMapper.deleteMessagesByUserId(userId);
    }
} 